package com.castle.fortress.admin.argFlow.dto;

import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;

/**
 * 聊天请求DTO
 */
@Data
@Accessors(chain = true)
public class ChatRequestDTO {
    
    /**
     * 聊天名称
     */
    private String name;
    
    /**
     * 头像的base64编码
     */
    private String avatar;
    
    /**
     * 关联的数据集ID列表
     */
    private List<String> dataset_ids;
    
    /**
     * 聊天助手使用的LLM设置对象
     */
    private LLMConfig llm;
    
    /**
     * LLM遵循的指令对象
     */
    private PromptConfig prompt;
    
    /**
     * LLM配置
     */
    @Data
    public static class LLMConfig {
        /**
         * 聊天模型名称，若未设置，则使用用户的默认聊天模型
         */
        private String model_name;
        
        /**
         * 控制模型预测的随机性，值越低响应越保守，越高响应越多样化，默认0.1
         */
        private Double temperature;
        
        /**
         * 核心采样参数，设置选择较小词汇的阈值，默认0.3
         */
        private Double top_p;
        
        /**
         * 避免模型重复信息，对已出现的词汇进行惩罚，默认0.2
         */
        private Double presence_penalty;
        
        /**
         * 减少模型频繁重复词汇，默认0.7
         */
        private Double frequency_penalty;
        
        /**
         * 模型输出的最大长度，以token数衡量，默认512
         */
        private Integer max_tokens;
    }
    
    /**
     * 提示配置
     */
    @Data
    public static class PromptConfig {
        /**
         * 设置用户查询与片段之间的相似度阈值，默认0.2
         */
        private Double similarity_threshold;
        
        /**
         * 设置关键词相似度在混合相似度得分中的权重，默认0.7
         */
        private Double keywords_similarity_weight;
        
        /**
         * 指定相似度得分高于阈值的前N个片段输入LLM，默认8
         */
        private Integer top_n;
        
        /**
         * 在聊天配置的'System'字段中使用的变量列表
         */
        private List<Map<String, Object>> variables;
        
        /**
         * 若未指定，则使用向量余弦相似度；否则使用重新排序得分
         */
        private String rerank_model;
        
        /**
         * 根据特定排序标准重新排序或选择前k个项目的数量，默认1024
         */
        private Integer top_k;
        
        /**
         * 若用户问题在数据集中未检索到内容时使用的响应
         */
        private String empty_response;
        
        /**
         * 用户的开场问候，默认为"Hi! I am your assistant, can I help you?"
         */
        private String opener;
        
        /**
         * 是否显示文本的来源，默认为true
         */
        private Boolean show_quote;
        
        /**
         * 提示内容
         */
        private String prompt;
    }
} 